package com.cmeduSystem.common.online.script;

import com.cmeduSystem.common.core.object.MyPageParam;
import lombok.Builder;
import lombok.Data;
import org.mozilla.javascript.NativeArray;

import java.util.ArrayList;
import java.util.List;

/**
 * API脚本执行的查询构建器。
 *
 * @author xulei
 * @date 2025-09-04
 */
@Builder
@Data
public class ApiQueryBuilder {

    /**
     * SQL语句。
     */
    private String sql;

    /**
     * 参数列表。
     */
    private List<Object> paramList;

    /**
     * 分页参数转换器。
     */
    private MyPageParam pageParam;

    /**
     * 表字段关联关系列表。如一对一，一对多，关联数据聚合计算等。
     */
    private NativeArray jsRelations;

    /**
     * 表字段字典关联关系列表。
     */
    private NativeArray jsDictRelations;

    /**
     * 创建一个新的构建器实例。
     */
    public static ApiQueryBuilder create() {
        return ApiQueryBuilder.builder()
                .paramList(new ArrayList<>())
                .build();
    }

    /**
     * 设置SQL语句。
     *
     * @param sql SQL语句
     * @return 当前构建器实例
     */
    public ApiQueryBuilder setSql(String sql) {
        this.sql = sql;
        return this;
    }

    /**
     * 添加参数。
     *
     * @param param 参数值
     * @return 当前构建器实例
     */
    public ApiQueryBuilder addParam(Object param) {
        if (this.paramList == null) {
            this.paramList = new ArrayList<>();
        }
        this.paramList.add(param);
        return this;
    }

    /**
     * 添加多个参数。
     *
     * @param params 参数值列表
     * @return 当前构建器实例
     */
    public ApiQueryBuilder addParams(List<Object> params) {
        if (this.paramList == null) {
            this.paramList = new ArrayList<>();
        }
        if (params != null) {
            this.paramList.addAll(params);
        }
        return this;
    }

    /**
     * 设置分页参数。
     *
     * @param pageParam 分页参数转换器
     * @return 当前构建器实例
     */
    public ApiQueryBuilder setPageParam(MyPageParam pageParam) {
        this.pageParam = pageParam;
        return this;
    }

    /**
     * 设置表字段的关联关系列表。如一对一，一对多，关联数据聚合计算等。
     *
     * @param jsRelations 关联关系列表。
     * @return 当前构建器实例
     */
    public ApiQueryBuilder setRelations(NativeArray jsRelations) {
        this.jsRelations = jsRelations;
        return this;
    }

    /**
     * 设置表字段的字典关联关系列表。
     *
     * @param jsDictRelations 字典关联关系列表。
     * @return 当前构建器实例
     */
    public ApiQueryBuilder setDictRelations(NativeArray jsDictRelations) {
        this.jsDictRelations = jsDictRelations;
        return this;
    }

    /**
     * 构建查询构建器。
     *
     * @return 查询构建器实例
     */
    public ApiQueryBuilder build() {
        return this;
    }
}
